#include <stdio.h>
#include <stdlib.h>
// #include "desenhar.h"
// #include "sdl/SDL.H"

#define TAM 10

/*Quantos existem alinhados naquela direcao.*/
int alinhados(int tab[TAM][TAM], int posl, int posc, int jog, int dir){
       int i, j, n, go; /*linha, coluna auxiliares, numero de alinhados*/
       int incrl, incrc;/*incrementos de linha e coluna*/
       
       switch(dir%4){/*incrementos --> dao a direcao da verificacao*/
                   case 0:
                        incrl = 0;
                        incrc = 1;
                        break;
                   case 1:
                        incrl = 1;
                        incrc = 1;
                        break;
                   case 2:
                        incrl = 1;
                        incrc = 0;
                        break;
                   case 3:
                        incrl = 1;
                        incrc = -1;
                        break;
                        }
       if(dir > 3){/*Caso seja >3, inverte o sentido indicado.*/
              incrl = -incrl;
              incrc = -incrc;
              }
       i = posl;
       j = posc;
       n = 0;
       go = 1;
       
       /*Nao sei se precisa verificar o alinhamento de 5...*/
       do /*&& n < 5 && go)*/{
                              
               i += incrl;
               j += incrc;
               
               /*verificando se ainda esta dentro dos limites do tabuleiro*/
               if((i < TAM) && (i >= 0) && (j < TAM) && (j >= 0)){
                     /*se for do jogador, conta.*/
                     if(tab[i][j] == jog){
                                    n++;
                               }
                     else{
                          go = 0;
                          }
                     }
                          
                else{
                     go = 0;
                     }
                }while(go);
                
       if(dir < 4){/*Se dir < 4 (ou seja, <= 3), deve ver no outro sentido, tambem.*/
              n += alinhados(tab, posl, posc, jog, dir + 4);
              n += 1;/*Sempre considere que, na posicao indicada, ha uma peca da sua cor.
               Assim, esta funcao tambem pode ser usada para os bots calcularem
               melhor jogada! =D */
              }
       
       return n;
       }

/*Retorna em resp um vetor com 4 posicoes, indicando quantas pecas ha alinhadas
  nas DIRECOES dadas abaixo:
      
      1 2 3
      0 . 0
      3 2 1
      
      (ligue os numeros iguais, passando pelo ponto, para entender a direcao)
      */
void alinhamento(int *resp, int tab[TAM][TAM], int posl, int posc, int jog){
     int i;
     for(i = 0; i < 4; i++){
           resp[i] = alinhados(tab, posl, posc, jog, i);
           printf("direcao %d: %d alinhados\n", i, resp[i]);
           }
     }


/*Zera todas as posicoes do tabuleiro tab*/
void tab_ini(int tab[TAM][TAM]){
     int i, j;
     for(i = 0; i < TAM; i++){
           for(j = 0; j < TAM; j++){
                 tab[i][j] = 0;
           }
     }
}

/*void tab_print(int *tab){
     int i = 0, aux = TAM*TAM;
     
     printf("\n\nTabuleiro atual:\n\n");
     
     while(i < aux){
             if(!((i)%TAM)){
                          printf("\n\n%2d  ", i/TAM);
                          }
             printf(" %2d", tab[i]);
             i++;
             }
     printf("\n\n    ");
     i = 0;
     while(i < TAM){
             printf(" %2d", i++);
             }
     }
*/
/*Verifica se a posicao (l, c) pode ser jogada (return 1) ou nao (return 0).*/
int verifica(int tab[TAM][TAM], int l, int c){
    static int i, j, redor, dir;
           if(l >= TAM || c >= TAM || l < 0 || c < 0)
                return 0; /*Nao jogar fora do tabuleiro!*/
           if(tab[l][c]){
                          return 0; /*ja tem peca!*/
                          }
           return 1;/*retorna 1 se puder jogar ali*/
           }

/*Verifica se o jogador venceu. Retorna o numero do jogador, caso
  isso aconteca. Retorna 0 caso contrario.*/
int ganhou(int tab[TAM][TAM], int jogador, int l, int c){
    
    int i, max;
    int a[4];
    
    max = 0;
    printf("\n\nMostrando alinhamentos atuais onde foi jogado:\n\n");
    alinhamento(a, tab, l, c, jogador);
    printf("\n");
    max = 0;
    for(i = 0; i < 4; i++){
          if(a[i] > max) max = a[i];
          }
    printf("max = %d\n\n", max);
    if(max >= 5) return jogador;
    return 0;
}
    
/*Joga como jogador na linha l e coluna c*/
int joga(int tab[TAM][TAM], int jogador, int l, int c){
    int ok;
    ok = verifica(tab, l, c);
    if(ok >= 1){ /*pode jogar!*/
           tab[l][c] = jogador;
           printf("\n\njogada: player %d em (%d, %d)", jogador, l, c);
           ok = ganhou(tab, jogador, l, c);
           if(ok){
                  printf("Parabens! Jogador %d venceu!! =D\n", ok);
                  }
           }
    else return -1; /*-1 = nao jogou!*/
    return ok;/*retorna numero do jogador, caso haja vencedor; retorna 0 se nao
      pode jogar...*/
}


void pegar_jogada(int jogada[2], int vez){
     printf("\n\nJogador %d, digite as coordenadas de sua jogada:\n\t", vez);
     scanf("%d %d", &jogada[0], &jogada[1]);
     }

int main(int argc, char *argv[]){
    int tab[TAM][TAM];
    int jogada[2], res;
    
    int vez;
    
    tab_ini(tab);
    desenhar_iniciar();
    
    
    vez = 1;
    do{
                   if(res != -1){
                          vez = (vez+1)%2;
                          }
                   else{
                        printf("\a\aHey, essa nao eh uma jogada valida!\nJogue dentro do tabuleiro E onde ainda nao ha pecas!! >:/\n");
                        }
//                    tab_print(tab);
                   
                   selecionar(jogada);
                   
                   
                   res = joga(tab, vez+1, jogada[0], jogada[1]);
                   desenhar( tab, jogada );
                   
                   
                   }while(res <= 0);
    
    fflush(stdin);
    getchar();
    
    return 0;
}
